package com.zpark.gmd.jushanpay.common.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class PageVO<T> implements Iterable<T>, Serializable {

    /*    private List<T> content = new ArrayList<T>();
        private long total;
        private int pageNo;
        private int pageSize;*/
    private List<T> items = new ArrayList<T>();
    private long counts;
    private int page;
    private int pageSize;

    public PageVO() {
    }

    public PageVO(List<T> items, long counts, int page, int pageSize) {
        this.items = items;
        this.counts = counts;
        this.page = page;
        this.pageSize = pageSize;
    }

    /**
     * 如果有上一页，则返回。
     *
     * @return 如果有上一页。
     */
    public boolean hasPrevious() {
        return getPage() > 0;
    }

    /**
     * 如果有下一页则返回。
     *
     * @return 如果有下一页。
     */
    public boolean hasNext() {
        return getPage() + 1 < getPages();
    }

    /**
     * 返回当前页面是否为第一个页面。
     *
     * @return 当前页面是否为第一页。
     */
    public boolean isFirst() {
        return !hasPrevious();
    }

    /**
     * 返回当前页是否为最后一页。
     *
     * @return 当前页面是否是最后一个页面。
     */
    boolean isLast() {
        return !hasNext();
    }

    /**
     * 返回所有页面的元素总数。
     *
     * @return 所有页面元素的总数
     */
    public long getCounts() {
        return counts;
    }

    public void setCounts(long counts) {
        this.counts = counts;
    }

    /**
     * 返回总页数。
     *
     * @return 返回总页数。
     */
    public int getPages() {
        return getPageSize() == 0 ? 1 : (int) Math.ceil((double) counts / (double) getPageSize());
    }

    /**
     * 返回不可修改的页面内容 {@link List}.
     *
     * @return 返回不可修改的页面内容 {@link List}
     */
    public List<T> getItems() {
        return Collections.unmodifiableList(items);
    }

    public void setItems(List<T> items) {
        this.items = items;
    }

    /**
     * 返回当前页面是否有内容。
     *
     * @return 返回当前页面是否有内容。
     */
    public boolean hasItems() {
        return getItemsSize() > 0;
    }

    /**
     * 返回当前页面上的元素数。
     *
     * @return 返回当前页面上的元素数。
     */
    public int getItemsSize() {
        return items.size();
    }

    /**
     * 返回每页的项数。
     *
     * @return 返回每页的项数。
     */
    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    /**
     * 返回当前页的编号. (Zero-based numbering.)
     *
     * @return 返回当前页的编号
     */
    public int getPage() {
        return page;
    }

    /**
     * 设置当前页数. (Zero-based numbering.)
     */
    public void setPage(int page) {
        this.page = page;
    }

    public Iterator<T> iterator() {
        return getItems().iterator();
    }
}
